【X68000(Z)アセンブラ講座 第028回 半透明機能A】   こんにちは!! 今回は画面の半透明機能についての続きです。 CG画面を8ビットカラー2画面モードに設定して(ページ0とページ1)、 ページ0とページ1の間で半透明表示を行います。 破線の内側を'A_BLEND2.s'と言うファイル名で保存して下さい。 ------------------------------------------------------------------------------------------------ ********************************************************************************* * * アプリ名 : A_BLEND2.x * * アルファブレンド(半透明機能) : 256色2画面モード * * Ver1.00 * ******************************************************************************** .cpu 68000 * CPUのタイプ include A:\XC\INCLUDE\DOSCALL.MAC * OSコール用マクロの読み込み include A:\XC\INCLUDE\IOCSCALL.MAC * IOCS(BIOS)コール用マクロの読み込み * システム領域のアドレス cg_palette equ $E82000 * CG用パレットデータの先頭アドレス sp_palette equ $E82200 * テキストとスプライトのパレットデータ先頭アドレス cg_buffer equ $C00000 * CG-VRAMの先頭アドレス cg0_scroll_x equ $E80018 * CG画面0のスクロールX座標 cg0_scroll_y equ $E8001A * CG画面0のスクロールY座標 cg1_scroll_x equ $E8001C * CG画面1のスクロールX座標 cg1_scroll_y equ $E8001E * CG画面1のスクロールY座標 vec_vdisp equ $000118 * 垂直同期(V-DISP)割り込み vec_hsync equ $00013C * 水平同期(H-SYNC)割り込み video_r1 equ $E82500 * 画面プライオリティ video_r2 equ $E82600 * 半透明/特殊プライオリティ制御 .data * '.data'以降のデータはデータセクションに配置される cgpal: dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_11111_0 dc.w %00000_00000_11111_0 dc.w %00000_11111_00000_0 dc.w %00000_11111_00000_0 .text * '.text'以降のプログラムはテキストセクションに配置される start: * スタートアドレス * ユーザーモードからスーパーバイザーモードに移行する moveq.l #_B_SUPER,d0 * d0にIOCS(BIOS)機能番号を代入 move.l #0,d1 * 数値0をd1に代入 movea.l d1,a1 * d1をa1にコピー trap #15 * IOCSコール実行 * 画面モードの設定 moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #8,d1 * 画面モードの番号 : 16 = 768x512x4bit / 8 = 512x512x8bit trap #15 * 画面をクリアして表示をオンにする moveq.l #_G_CLR_ON,d0 * 画面をクリアして表示をオンにする trap #15 bsr set_cgpalette * CGパレット設定ルーチンの呼び出し * 画面プライオリティの設定 movea.l #video_r1,a1 move.w (a1),d0 and.w #$ff,d0    or.w #$2400,d0 * move.w d0,(a1) * 半透明の設定 movea.l #video_r2,a2 move.w (a2),d0 and.w #$ff,d0 or.w #$1f00,d0 move.w d0,(a2) loop: moveq.l #0,d0 * 描画するCGページ move.w #3,d1 * 描画する色番号 move.w #64,d2 * X座標 move.w #64,d3 * Y座標 move.w #256,d4 * 描画する横ピクセル数 move.w #256,d5 * 描画する縦ピクセル数 bsr draw_box moveq.l #1,d0 move.w #5,d1 move.w #192,d2 move.w #192,d3 move.w #256,d4 move.w #256,d5 bsr draw_box moveq.l #_BITSNS,d0 moveq.l #0,d1 trap #15 and.b #%00000010,d0 tst.b d0 bne end bra loop end: moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #16,d1 * 画面モードの番号 : 16 = 768x512x4 trap #15 * スーパーバイザーモードからユーザーモードに戻る moveq.l #_B_SUPER,d0 move.l SP,a1 trap #15 * アプリ終了 dc.w _EXIT * OSコール実行 : _EXIT = プログラムの終了 * 色の付いた四角形を描画 draw_box: * in d0.w = CG-Page * in d1.w = color nuumber * in d2.w = X * in d3.w = Y * in d4.w = Width * in d5.w = Height movem.l d0/d2-d3/a0-a1,-(sp) movea.l #$C00000,a0 ext.l d2 add.l d2,d2 adda.l d2,a0 moveq.l #10,d2 ext.l d3 lsl.l d2,d3 adda.l d3,a0 moveq.l #19,d2 lsl.l d2,d0 adda.l d0,a0 moveq.l #0,d3 draw_box_1: movea.l a0,a1 moveq.l #0,d2 draw_box_2: move.w d1,(a1)+ addq.w #1,d2 cmp.w d4,d2 blt draw_box_2 adda.l #1024,a0 addq.w #1,d3 cmp.w d5,d3 blt draw_box_1 movem.l (sp)+,d0/d2-d3/a0-a1 rts set_cgpalette: lea cgpal,a0 movea.l #cg_palette,a1 moveq.l #0,d7 set_cgpalette_1: move.w (a0)+,(a1)+ addq.w #1,d7 cmp.w #6,d7 * 設定する色数 blt set_cgpalette_1 rts * Emd Of File ------------------------------------------------------------------------------------------------ コマンドプロンプトから、 A>as A_BLEND2.s [Enter] A>lk A_BLEND2.o [Enter] A>A_BLEND2.x [Enter] ・・・のように入力すると半透明の映像が表示されます。 手前(ページ0)に青いBOXと奥(ページ1)に赤いBOXが表示されていて 2つのBOXが重なった部分が半透明の紫色だったら正常です。 [ プログラムの解説 ] パレット設定について。 今回の8ビットカラーの半透明機能の場合、 同じ色でも不透明色と半透明色の両方を256色パレットレジスターに格納するので 実際には256色モードでも半分の128色しか発色できません。 サンプルの'cgpal:'ラベル以下を参考に 同じ色を2つ並べて最大128色分設定して下さい。 不透明描画の方法。 ページ0に偶数の色番号をVRAMに置き ページ1に奇数の色番号をVRAMに置く。 半透明描画の方法。 ページ0に奇数の色番号をVRAMに置き ページ1に奇数の色番号をVRAMに置く。 以上。 [ お知らせ ] 今回で中級編は終わりとさせていただきます。 次回からは上級編になりますが、 本講座はゲーム制作に役立つ機能に限定しているので 難しい内容はないと思っています。 今後とも宜しくお願い致します!! お疲れ様でした(^^) それではまた!! [EOF]